import os
import shutil
from abc import abstractmethod
from django.apps import apps
from django.db import models
from django.template.defaultfilters import slugify
from django.utils import timezone
from rest_framework.exceptions import ValidationError

from DataAnalysisManager.models import UserScore
from DataAnalysisManager.serializers import UserScoreSerializer
from HopeIESystem.settings import MEDIA_ROOT
from django.db.models import constraints, ExpressionWrapper, Func, TextField
# 更新文件名字段，但不触发模型的save方法
# 使用F表达式可以直接在数据库中更新而不需要加载模型实例
from django.db.models import F, Value
from django.db.models.functions import Concat

"""
这是所有模型的父模型
"""


# 父模型
class BaseModel(models.Model):
    class Meta:
        abstract = True

    # 相关人员存放相关人员的ID与角色
    """
    示例：
    [
      {
        'account':'23432',
        'name':'xxx',
        'role':'主讲人', 
      },
      {
        'account':'34',
        'name':'xxx2',
        'role':'打杂', 
      },
      {
        'account':'3434',
        'name':'xxx3',
        'role':'打杂', 
      }
    ]
    """
    authors = models.JSONField(verbose_name='相关人员', default=list)
    # 事项认定时间
    time = models.DateTimeField(verbose_name='认定时间', blank=True, null=True)

    # 审核人
    reviewer = models.CharField(max_length=200, blank=True, null=True, verbose_name='审核人')  # 审核人
    # 审核状态
    revstatus = models.CharField(max_length=200,
                                 choices=(('审核通过', '审核通过'), ('审核未通过', '审核未通过'), ('未审核', '未审核')),
                                 verbose_name='审核状态', default='未审核')
    # 审核时间
    review_time = models.DateTimeField(verbose_name='审核时间', default=None, null=True, blank=True)

    # 最大评分
    max_score = models.FloatField(verbose_name='最大评分', blank=True, null=True)
    # 分数权重,这是一个和authors长度一样的列表，里面的值是对分数的权重，权重相加为1，它是json列表
    """
    示例：
    权重会进行归一化
    [
      12,324,54
    ]
    """
    score_weights = models.JSONField(verbose_name='分数权重', blank=True, null=True, default=list)
    # 每位author的评分
    """
    [{
                    'account': author['account'],
                    'author_score': self.max_score * weight,
                }]
    """
    score = models.JSONField(verbose_name='分数', blank=True, default=list)
    # 创建时间
    created_time = models.DateTimeField(default=timezone.now, verbose_name='创建时间')
    # 上次修改时间
    modified_time = models.DateTimeField(auto_now=True, verbose_name='修改时间')
    # 附件
    attachment = models.FileField(upload_to='',  # 上传目录
                                  verbose_name='附件', help_text='仅上传pdf/zip', blank=True, null=True, max_length=1000
                                  # 设置数据库中可以存储的最大字符数
                                  )
    # 备注
    remark = models.CharField(verbose_name='备注', blank=True, null=True, max_length=255)

    def get_max_score(self):
        self.max_score = 0
        return self.max_score

    # 获取用户得分
    def get_author_scores(self):
        # 归一化处理权重self.score_weights是一个数组
        if not self.score_weights:
            self.score_weights = [1] * len(self.authors)

        self.score_weights = [round(weight / sum(self.score_weights), 2) for weight in self.score_weights]
        self.max_score = float(round(self.max_score,2))
        self.score = []
        # 计算每位作者的分数
        for author, weight in zip(self.authors, self.score_weights):
            self.score.append({'account': author['account'], 'author_score': round(self.max_score * weight, 2)})
            data = {'report_type': self.__class__.__name__, 'report_id': self.id, 'account': author['account'],
                    'role': author['role'], 'score': round(self.max_score * weight, 2), 'time': self.time}
            # 根据 report_id 和 report_type 获取或创建用户得分记录
            userscore, created = UserScore.objects.get_or_create(report_type=data['report_type'],
                                                                 report_id=data['report_id'], account=data['account'],
                                                                 defaults=data  # 如果创建新记录，使用data中的默认值填充其他字段
                                                                 )

            # 使用序列化器保存或更新
            serializer = UserScoreSerializer(userscore, data=data, partial=True)  # partial=True 允许部分字段更新
            if serializer.is_valid():
                serializer.save()
            else:
                raise ValidationError(serializer.errors)
        self.save()

    # 取消用户得分
    def cancel_user_score(self):
        UserScore.objects.filter(report_type=self.__class__.__name__, report_id=self.id).delete()

    def custom_upload_to(self):
        return os.path.join('Uploads', self.__class__.__name__, f'{self.id}')



    def clean_authors(self):
        """
            authors示例：
            [
              {
                'account':'23432',
                'role':'主讲人',
              },
              {
                'account':'34',
                'role':'打杂',
              },
              {
                'account':'3434',
                'role':'打杂',
              }
            ]
            """
        # 如果authors不满足上述注释中示例的格式要求
        # 验证authors是否为列表
        if not isinstance(self.authors, list):
            return "Error: authors 必须是json列表"

            # 遍历列表中的每个作者信息
        for author in self.authors:
            # 验证每个作者信息是否为字典
            if not isinstance(author, dict):
                raise Exception("Error: 每一个 author 必须是字典")

                # 验证字典中是否包含'account'和'role'键，且它们的值不为空
            if 'account' not in author or not author['account']:
                raise Exception("Error: account键是必须的，它存放用户名（字符串）.")

            if 'role' not in author or not author['role']:
                raise Exception("Error: account键是必须的，它存放用户名的角色（字符串）.")
            # 验证字典中是否有name键
            if 'name' not in author or not author['name']:
                raise Exception("Error: name键是必须的，它存放用户名的姓名（字符串）.")

            # 字典中的account role name 必须为字符串
            if not isinstance(author['account'], str):
                raise Exception("Error: Each author's 'account' must be a string.")
            if not isinstance(author['role'], str):
                raise Exception("Error: Each author's 'role' must be a string.")
            if not isinstance(author['name'], str):
                raise Exception("Error: Each author's 'name' must be a string.")

                # 如果authors不是列表或者包含重复元素，则抛出ValidationError
        if not isinstance(self.authors, list):
            raise ValidationError({'authors': 'authors must be a list.'})

        unique_authors_list = []
        # 去除self.authors中的空字符串元素
        self.author_accounts = [author['account'] for author in self.authors if author]
        for author_account in self.author_accounts:
            if author_account in unique_authors_list:
                raise ValidationError('相关人员似乎有重复.')
            unique_authors_list.append(author_account)

    def clean_score_weights(self):

        # 验证是否为空list,如果为空则平分
        if not self.score_weights:
            self.score_weights = [1 / len(self.authors) for weight in self.authors]

        # 验证score_weights是否为列表
        if not isinstance(self.score_weights, list):
            raise ValidationError({'error': 'score_weights（分数权重）必须为列表'})
        # 验证score_weights中的每个元素是否为数字
        for weight in self.score_weights:
            if not isinstance(weight, (int, float)):
                raise ValidationError({'error': 'score_weights（分数权重）中的元素必须为正数'})
        # 验证为正数
        for weight in self.score_weights:
            if weight <= 0:
                raise ValidationError({'error': 'score_weights（分数权重）中的元素必须为正数'})
        # 验证元素个数与authors个数一致
        if len(self.score_weights) != len(self.authors):
            raise ValidationError({'error': 'score_weights（分数权重）的元素个数应该与作者数相同'})

    def save(self, *args, **kwargs):
        self.full_clean()  # 调用clean方法进行验证
        self.max_score = self.get_max_score()
        self.max_score = float(round(self.max_score,2))
        adding = self.pk is None  # 判断是否为新实例
        # 如果是新实例，则需要先保存到数据库以获取主键（ID）
        if adding:
            super().save(*args, **kwargs)  # 保存实例以生成ID
            self.created_time = timezone.now()
            if self.time is None:
                self.time = self.created_time
        else:  # 如果是修改旧实例
            # 修改时间自动更新
            self.modified_time = timezone.now()
            super().save(*args, **kwargs)


"""
基本教学任务模型：
完成基本教学任务，30分
学生评价，20分
系部专任教师同行评价，10分
到课率，10分
说明：1.非教师本人原因导致的工作量不足的，听课等其他课时折算为课时后满足基本工作量的，视为工作量满足要求。
2.学生评价由教务处提供，折算为满分20分。
3.到课率由教务处提供，折算为满分10分。
"""


# 教师个人情况
class BasicTeachingTask(BaseModel):
    class Meta:
        verbose_name = '基本教学任务'
        verbose_name_plural = verbose_name
    input_info = """
本项为单人项，仅添自己为相关人员即可，自己获取全部分数。
基本教学任务模型：
完成基本教学任务，30分
学生评价，20分
系部专任教师同行评价，10分
到课率，10分
说明：1.非教师本人原因导致的工作量不足的，听课等其他课时折算为课时后满足基本工作量的，视为工作量满足要求。
2.学生评价由教务处提供，折算为满分20分。
3.到课率由教务处提供，折算为满分10分。
"""

    # 基本教学任务分
    class_workload_score = models.FloatField(verbose_name='基本教学任务分', default=0)
    # 学生评价分
    student_evaluation_score = models.FloatField(verbose_name='学生评价分', default=0)
    # 系部专任教师同行评价分
    teacher_evaluation_score = models.FloatField(verbose_name='系部专任教师同行评价分', default=0)
    # 到课率分
    attendance_score = models.FloatField(verbose_name='到课率分', default=0)

    def get_max_score(self):
        # 计算最大分数
        self.max_score = (
                self.class_workload_score + self.student_evaluation_score + self.teacher_evaluation_score + self.attendance_score)

        return self.max_score


"""
教学竞赛类
教研室参与0.5分/次，系部参与1分/次，校赛区奖2分/次，校半决赛3分/次
校级三等奖及以下，5分
校级二等奖，8分
校级一等奖，15分
市厅级三等奖及以下，8分
市厅级二等奖，15分
市厅级一等奖，25分
省级三等奖及以下，15分
省级二等奖，25分
省级一等奖，35分
国家级三等奖及以下，25分
国家级二等奖，35分
国家级一等奖，50分
集团级三等奖及以下，5分
集团级二等奖，8分
集团级一等奖，15分
说明：
1.获奖须以学校为第一作者单位，省级、国家级竞赛学校作为参与单位的，按获奖分数折半加分。
2.以团队形式获奖的，教师自行商定加分，且不超过项目总分。
3.竞赛级别以教务处通知为准。
4.同一个比赛取最高分。
"""


# 教师竞赛模型
class TeacherCompetition(BaseModel):
    name = models.CharField(verbose_name='竞赛名称', max_length=255)
    levels_choices = (
        ('校级三等奖及以下', '校级三等奖及以下'), ('校级二等奖', '校级二等奖'), ('校级一等奖', '校级一等奖'),
        ('集团级三等奖及以下', '集团级三等奖及以下'), ('集团级二等奖', '集团级二等奖'),
        ('集团级一等奖', '集团级一等奖'), ('市厅级三等奖及以下', '市厅级三等奖及以下'),
        ('市厅级二等奖', '市厅级二等奖'), ('市厅级一等奖', '市厅级一等奖'), ('省级三等奖及以下', '省级三等奖及以下'),
        ('省级二等奖', '省级二等奖'), ('省级一等奖', '省级一等奖'), ('国家级三等奖及以下', '国家级三等奖及以下'),
        ('国家级二等奖', '国家级二等奖'), ('国家级一等奖', '国家级一等奖'), ('未获奖但校半决赛', '未获奖但校半决赛'),
        ('未获奖但校赛区', '未获奖但校赛区'), ('未获奖但系部参与', '未获奖但系部参与'),
        ('未获奖但教研室参与', '未获奖但教研室参与'),)
    levels = models.CharField(verbose_name='奖项', choices=levels_choices, max_length=100)
    # 获奖时间
    time = models.DateTimeField(verbose_name='获奖时间')
    organizer_options = models.CharField(verbose_name='主办方', max_length=255)
    tracks = models.CharField(verbose_name='赛道', max_length=255)
    # 学校是否为第一作者单位
    is_first_unit = models.BooleanField(verbose_name='是否为第一作者单位', default=False)

    class Meta:
        verbose_name = '教师竞赛'
        verbose_name_plural = verbose_name  # 设置唯一约束name levels organizer_options tracks is_first_unit remark
    input_info = """
本项为单人项或多人项，单个老师参加的比赛获奖那么负责人添加自己，自己获取全部分数，多个老师参加的比赛获取的奖由你们指定一位老师为负责人，让ta添加。
教学竞赛类
教研室参与0.5分/次，系部参与1分/次，校赛区奖2分/次，校半决赛3分/次
校级三等奖及以下，5分
校级二等奖，8分
校级一等奖，15分
市厅级三等奖及以下，8分
市厅级二等奖，15分
市厅级一等奖，25分
省级三等奖及以下，15分
省级二等奖，25分
省级一等奖，35分
国家级三等奖及以下，25分
国家级二等奖，35分
国家级一等奖，50分
集团级三等奖及以下，5分
集团级二等奖，8分
集团级一等奖，15分
说明：
1.获奖须以学校为第一作者单位，省级、国家级竞赛学校作为参与单位的，按获奖分数折半加分。
2.以团队形式获奖的，教师自行商定加分，且不超过项目总分。
3.竞赛级别以教务处通知为准。
4.同一个比赛取最高分。
"""

    # 定义一个方法来序列化authors，以便于创建索引

    def get_max_score(self):
        # 计算最大分数结合上面的描述计算最大分数
        self.max_score = 0
        if self.levels == '校级三等奖及以下':
            self.max_score = 5
        elif self.levels == '校级二等奖':
            self.max_score = 8
        elif self.levels == '校级一等奖':
            self.max_score = 15
        elif self.levels == '市厅级三等奖及以下':
            self.max_score = 8
        elif self.levels == '市厅级二等奖':
            self.max_score = 15
        elif self.levels == '市厅级一等奖':
            self.max_score = 25
        elif self.levels == '省级三等奖及以下':
            self.max_score = 15
        elif self.levels == '省级二等奖':
            self.max_score = 25
        elif self.levels == '省级一等奖':
            self.max_score = 35
        elif self.levels == '国家级三等奖及以下':
            self.max_score = 25
        elif self.levels == '国家级二等奖':
            self.max_score = 35
        elif self.levels == '国家级一等奖':
            self.max_score = 50
        elif self.levels == '集团级三等奖及以下':
            self.max_score = 5
        elif self.levels == '集团级二等奖':
            self.max_score = 8
        elif self.levels == '集团级一等奖':
            self.max_score = 15
        elif self.levels == '未获奖但校半决赛':
            self.max_score = 3
        elif self.levels == '未获奖但校赛区':
            self.max_score = 2
        elif self.levels == '未获奖但系部参与':
            self.max_score = 1
        elif self.levels == '未获奖但教研室参与':
            self.max_score = 0.5
        if not self.is_first_unit:
            self.max_score = self.max_score / 2
        return self.max_score


"""
教师能力提升	
    教师获得中级职称加3分/人/次
	教师获得副高级职称加10分/人/次
	教师获得正高级职称加20分/人/次
	教师获得行业中级资格证书3分/人/次
	教师获得行业高级资格证书10分/人/次
	说明：
1.须在考核周期内获得职称、证书。
2.职称加分不与个人情况加分重复。
"""


# 职称证书模型
class Certificate(BaseModel):
    class Meta:
        verbose_name = '证书报备'
        verbose_name_plural = '证书报备'
    input_info = """
这是单人项，仅添加自己为相关人员，自己获取全部分数（分数权重1）。
教师能力提升	
    教师获得中级职称加3分/人/次
	教师获得副高级职称加10分/人/次
	教师获得正高级职称加20分/人/次
	教师获得行业中级资格证书3分/人/次
	教师获得行业高级资格证书10分/人/次
	说明：
1.须在考核周期内获得职称、证书。
2.职称加分不与个人情况加分重复。
"""

    name = models.CharField(verbose_name='职称证书名称', max_length=255)
    issuing_authorsity = models.CharField(verbose_name='颁发机构', max_length=255)
    # 证书类型
    certificate_type_choices = (
        ('中级职业证书', '中级职业证书'), ('高级职业证书', '高级职业证书'), ('中级职称', '中级职称'),
        ('副高级职称', '副高级职称'), ('正高级职称', '正高级职称'), ('其它证书', '其它证书'),)
    certificate_type = models.CharField(verbose_name='证书类型', choices=certificate_type_choices, default='其它证书',
                                        max_length=255)
    time = models.DateTimeField(verbose_name='授予时间')

    def get_max_score(self):
        # 计算最大分数结合上面的描述计算最大分数
        self.max_score = 0
        if self.certificate_type == '中级职业证书':
            self.max_score = 3
        elif self.certificate_type == '高级职业证书':
            self.max_score = 10
        elif self.certificate_type == '中级职称':
            # 获取中级职称分数后 原本个人信息需要加的分数要扣除3-3=0分
            self.max_score = 0
        elif self.certificate_type == '副高级职称':
            # 获取职称分数后 原本个人信息需要加的分数要扣除10-6=4分
            self.max_score = 4
        elif self.certificate_type == '正高级职称':
            # 获取职称分数后 原本个人信息需要加的分数要扣除20-10=0分
            self.max_score = 10
        return self.max_score


"""
创新创业	完整资料提交到系部加0.5/项，系部筛选后报到教务处1分/项
校级立项,2分
市厅级立项，5分
省级立项，10分
国家级立项，20分
校级结题,3分
市厅级结题，7.5分
省级结题，15分
国家级结题，30分
说明：
1.项目须以学校为第一作者单位，省级、国家级项目学校作为参与单位的，按项目分数折半加分。
2.由多人、多部门参与的项目，教师自行商定加分，且不超过项目总分。
3.同一个项目取最高分
"""


# 大学生创新创业项目
class InnovationProject(BaseModel):
    class Meta:
        verbose_name = '大学生创新创业项目'
        verbose_name_plural = '大学生创新创业项目'
    input_info = """
这是多人项，一般情况下由第一指导老师当负责人并填写，如果只有一个指导老师 那么自己获取全部分数。
创新创业	完整资料提交到系部加0.5/项，系部筛选后报到教务处1分/项
校级立项,2分
市厅级立项，5分
省级立项，10分
国家级立项，20分
校级结题,3分
市厅级结题，7.5分
省级结题，15分
国家级结题，30分
说明：
1.项目须以学校为第一作者单位，省级、国家级项目学校作为参与单位的，按项目分数折半加分。
2.由多人、多部门参与的项目，教师自行商定加分，且不超过项目总分。
3.同一个项目取最高分
"""

    # 项目名称
    name = models.CharField(verbose_name='项目名称', max_length=255)
    levels_choices = (('校级', '校级'), ('市厅级', '市厅级'), ('省级', '省级'), ('国家级', '国家级'),
                      ('仅完整资料提交到系部', '仅完整资料提交到系部'),
                      ('仅完整资料提交到教务处', '仅完整资料提交到教务处'),

                      )
    levels = models.CharField(verbose_name='项目等级', choices=levels_choices, max_length=255)
    # 项目状态 立项还是结项
    status_choices = (('立项', '立项'), ('结项', '结项'),)
    status = models.CharField(verbose_name='项目状态', choices=status_choices, max_length=255)

    # 是否本校是第一单位
    is_first_unit = models.BooleanField(verbose_name='是否本校第一单位', default=True)

    def get_max_score(self):
        self.max_score = 0
        if self.levels == '仅完整资料提交到系部':
            self.max_score = 0.5
        elif self.levels == '仅完整资料提交到教务处':
            self.max_score = 1
        if self.levels == '校级' and self.status == '立项':
            self.max_score = 2
        elif self.levels == '校级' and self.status == '结项':
            self.max_score = 3
        elif self.levels == '市厅级' and self.status == '立项':
            self.max_score = 5
        elif self.levels == '市厅级' and self.status == '结项':
            self.max_score = 7.5
        elif self.levels == '省级' and self.status == '立项':
            self.max_score = 10
        elif self.levels == '省级' and self.status == '结项':
            self.max_score = 15
        elif self.levels == '国家级' and self.status == '立项':
            self.max_score = 20
        elif self.levels == '国家级' and self.status == '结项':
            self.max_score = 30

        if not self.is_first_unit:
            self.max_score = self.max_score / 2
        return self.max_score


"""
教科研项目立项	校级，4分
	市厅级，10分
	省级，20分
	国家级，50分
	集团级，6分
	说明：
1.项目须在考核周期内完成立项。
2.由多人、多部门参与的项目，教师自行商定加分，且不超过项目总分。
3.项目须以学校为第一作者单位，学校作为参与单位的，按照项目分数折半加分。
教科研项目结题	校级，6分
	市厅级，15分
	省级，30分
	国家级，75分
	集团级，10分
	说明：
1.项目须在考核周期内完成结题。
2.由多人、多部门参与结题的项目，教师自行商定加分，且不超过项目总分。
3.项目须以学校为第一作者单位，学校作为参与单位的，按照项目分数折半加分。
"""


# 科研项目立项结题
class ResearchProject(BaseModel):
    class Meta:
        verbose_name = '科研项目'
        verbose_name_plural = '科研项目'  # 设置唯一约束
    input_info = """
项目是多人项目 由每一个项目的负责人填写并分配分数
仅 '已申请':
'校级':2
'市厅级': 4
'省级':6
'国家级':8
'集团级':3
教科研项目立项	校级，4分
	市厅级，10分
	省级，20分
	国家级，50分
	集团级，6分
	说明：
1.项目须在考核周期内完成立项。
2.由多人、多部门参与的项目，教师自行商定加分，且不超过项目总分。
3.项目须以学校为第一作者单位，学校作为参与单位的，按照项目分数折半加分。
教科研项目结题	校级，6分
	市厅级，15分
	省级，30分
	国家级，75分
	集团级，10分
	说明：
	
是否被推至集团或教育厅且立项失败（即选择  已申请且 且选择 被推至集团）
市厅级，2分
市厅级：5分
省级，10分
国家级，25分
集团级，3分
1.项目须在考核周期内完成结题。
2.由多人、多部门参与结题的项目，教师自行商定加分，且不超过项目总分。
3.项目须以学校为第一作者单位，学校作为参与单位的，按照项目分数折半加分。
"""

    # 科研项目名称
    name = models.CharField(max_length=255, verbose_name='项目名称')
    # 立项编号
    number = models.CharField(max_length=255, verbose_name='立项编号', blank=True, null=True)
    # 项目级别，不可以空 choices为上面说明的等级
    levels_choices = (
        ('校级', '校级'), ('市厅级', '市厅级'), ('省级', '省级'), ('国家级', '国家级'), ('集团级', '集团级'))
    levels = models.CharField(max_length=10, choices=levels_choices, verbose_name='项目级别')
    # 项目状态
    status_choices = (('已申请', '已申请'), ('立项', '立项'), ('结题', '结题'),)
    status = models.CharField(max_length=10, choices=status_choices, verbose_name='项目状态')
    # 项目立项时间 不可为空
    time = models.DateTimeField(verbose_name='认定时间', blank=True, null=True)
    # 项目来源，可以为空
    source = models.CharField(max_length=255, verbose_name='项目来源', blank=True, null=True)
    # 项目管理单位
    unit = models.CharField(max_length=255, verbose_name='项目管理单位', blank=True)

    # 是否以本校为第一单位
    is_first_unit = models.BooleanField(default=False, verbose_name='是否以本校为第一单位')

    # 是否被推至集团或教育厅，但是立项失败，如果是则总分减半
    is_push_to_group = models.BooleanField(default=False, verbose_name='是否被推至集团或教育厅且立项失败')

    def get_max_score(self):
        self.max_score = 0
        if self.status == '已申请':
            if self.levels == '校级':
                self.max_score = 2
            elif self.levels == '市厅级':
                self.max_score = 4
            elif self.levels == '省级':
                self.max_score = 6
            elif self.levels == '国家级':
                self.max_score = 8
            elif self.levels == '集团级':
                self.max_score = 3
        elif self.status == '立项':
            if self.levels == '校级':
                self.max_score = 4
            elif self.levels == '市厅级':
                self.max_score = 10
            elif self.levels == '省级':
                self.max_score = 20
            elif self.levels == '国家级':
                self.max_score = 50
            elif self.levels == '集团级':
                self.max_score = 6
        elif self.status == '结题':
            if self.levels == '校级':
                self.max_score = 6
            elif self.levels == '市厅级':
                self.max_score = 15
            elif self.levels == '省级':
                self.max_score = 30
            elif self.levels == '国家级':
                self.max_score = 75
            elif self.levels == '集团级':
                self.max_score = 10
        if not self.is_first_unit:
            self.max_score = self.max_score / 2
        if self.is_push_to_group and self.status == '已申请':
            if self.levels == '校级':
                self.max_score = 2
            elif self.levels == '市厅级':
                self.max_score = 5
            elif self.levels == '省级':
                self.max_score = 10
            elif self.levels == '国家级':
                self.max_score = 25
            elif self.levels == '集团级':
                self.max_score = 3
        return self.max_score


"""
学生竞赛	国家级一级特等奖一等奖，40分/项
国家级一级二等奖，30分/项
国家级一级三等奖，20分/项
国家级二级特等奖一等奖，30分/项
国家级二级二等奖，20分/项
国家级二级三等奖，15分/项
国家级三级特等奖一等奖，25分/项
国家级三级二等奖，18分/项
国家级三级三等奖，12分/项
省级一级特等奖一等奖，18分/项
省级一级二等奖，12分/项
省级一级三等奖，8分/项
省级二级特等奖一等奖，12分/项
省级二级二等奖，8分/项
省级二级三等奖，5分/项
省级三级特等奖一等奖，8分/项
省级三级二等奖，5分/项
省级三级三等奖，3分/项
市厅级特等奖一等奖，3分/项
市厅级二等奖，2分/项
市厅级三等奖，1分/项
校赛组织，5分/次
说明：
1.获奖须以学校为第一作者单位，省级、国家级竞赛学校作为参与单位的，按获奖分数折半加分。
2.以团队形式开展指导获奖的，教师自行商定加分，且不超过项目总分。
3.校赛组织以团队形式进行的，教师自行商定加分，且不超过项目总分。
4.各级别三等奖以下的，按照该级别二等奖折半加分。
5.竞赛级别以教务处通知为准。
"""


# 教师学生竞赛
class StudentCompetition(BaseModel):
    name = models.CharField(verbose_name='竞赛名称', max_length=255)
    levels_choices = (('国家级一级一等奖', '国家级一级一等奖'), ('国家级一级二等奖', '国家级一级二等奖'),
                      ('国家级一级三等奖', '国家级一级三等奖'), ('国家级一级其它奖', '国家级一级其它奖'),
                      ('国家级二级一等奖', '国家级二级一等奖'), ('国家级二级二等奖', '国家级二级二等奖'),
                      ('国家级二级三等奖', '国家级二级三等奖'), ('国家级二级其它奖', '国家级二级其它奖'),
                      ('国家级三级一等奖', '国家级三级一等奖'), ('国家级三级二等奖', '国家级三级二等奖'),
                      ('国家级三级三等奖', '国家级三级三等奖'), ('国家级三级其它奖', '国家级三级其它奖'),
                      ('省级一级一等奖', '省级一级一等奖'), ('省级一级二等奖', '省级一级二等奖'),
                      ('省级一级三等奖', '省级一级三等奖'), ('省级一级其它奖', '省级一级其它奖'),
                      ('省级二级一等奖', '省级二级一等奖'), ('省级二级二等奖', '省级二级二等奖'),
                      ('省级二级三等奖', '省级二级三等奖'), ('省级二级其它奖', '省级二级其它奖'),
                      ('省级三级一等奖', '省级三级一等奖'), ('省级三级二等奖', '省级三级二等奖'),
                      ('省级三级三等奖', '省级三级三等奖'), ('省级三级其它奖', '省级三级其它奖'),
                      ('市厅级一等奖', '市厅级一等奖'), ('市厅级二等奖', '市厅级二等奖'),
                      ('市厅级三等奖', '市厅级三等奖'), ('市厅级其它奖', '市厅级其它奖'), ('校赛一等奖', '校赛一等奖'),
                      ('校赛二等奖', '校赛二等奖'), ('校赛三等奖', '校赛三等奖'), ('校赛其它奖', '校赛其它奖'),)
    levels = models.CharField(verbose_name='奖项', choices=levels_choices, max_length=100)
    # 参赛学生姓名，这里是字符串 让他们自己写好信息即可
    students = models.CharField(verbose_name='参赛学生', max_length=255, default='')

    # 事务时间
    time = models.DateTimeField(verbose_name='获奖时间')
    organizer_options = models.CharField(verbose_name='主办方', max_length=255)
    tracks = models.CharField(verbose_name='赛道', max_length=255)
    # 是否学校是第一单位
    is_first_unit = models.BooleanField(verbose_name='是否学校第一单位', default=False)

    class Meta:
        verbose_name = '学生竞赛报备'
        verbose_name_plural = '学生竞赛报备'  # 设置唯一约束name levels students tracks
    input_info = """
这是多人项，一般情况下由第一指导老师当负责人并填写，如果只有一个指导老师 那么自己获取全部分数。
学生竞赛	国家级一级特等奖一等奖，40分/项
国家级一级二等奖，30分/项
国家级一级三等奖，20分/项
国家级二级特等奖一等奖，30分/项
国家级二级二等奖，20分/项
国家级二级三等奖，15分/项
国家级三级特等奖一等奖，25分/项
国家级三级二等奖，18分/项
国家级三级三等奖，12分/项
省级一级特等奖一等奖，18分/项
省级一级二等奖，12分/项
省级一级三等奖，8分/项
省级二级特等奖一等奖，12分/项
省级二级二等奖，8分/项
省级二级三等奖，5分/项
省级三级特等奖一等奖，8分/项
省级三级二等奖，5分/项
省级三级三等奖，3分/项
市厅级特等奖一等奖，3分/项
市厅级二等奖，2分/项
市厅级三等奖，1分/项
校赛组织，5分/次
说明：
1.获奖须以学校为第一作者单位，省级、国家级竞赛学校作为参与单位的，按获奖分数折半加分。
2.以团队形式开展指导获奖的，教师自行商定加分，且不超过项目总分。
3.校赛组织以团队形式进行的，教师自行商定加分，且不超过项目总分。
4.各级别三等奖以下的，按照该级别二等奖折半加分。
5.竞赛级别以教务处通知为准。
"""

    # 定义一个方法来序列化authors，以便于创建索引

    def get_max_score(self):
        self.max_score = 0
        if self.levels == '国家级一级一等奖':
            self.max_score = 40
        elif self.levels == '国家级一级二等奖':
            self.max_score = 30
        elif self.levels == '国家级一级三等奖':
            self.max_score = 20
        elif self.levels == '国家级一级其它奖':
            self.max_score = 15
        elif self.levels == '国家级二级一等奖':
            self.max_score = 30
        elif self.levels == '国家级二级二等奖':
            self.max_score = 20
        elif self.levels == '国家级二级三等奖':
            self.max_score = 15
        elif self.levels == '国家级二级其它奖':
            self.max_score = 10
        elif self.levels == '国家级三级一等奖':
            self.max_score = 25
        elif self.levels == '国家级三级二等奖':
            self.max_score = 18
        elif self.levels == '国家级三级三等奖':
            self.max_score = 12
        elif self.levels == '国家级三级其它奖':
            self.max_score = 9
        elif self.levels == '省级一级一等奖':
            self.max_score = 18
        elif self.levels == '省级一级二等奖':
            self.max_score = 12
        elif self.levels == '省级一级三等奖':
            self.max_score = 8
        elif self.levels == '省级一级其它奖':
            self.max_score = 6
        elif self.levels == '省级二级一等奖':
            self.max_score = 12
        elif self.levels == '省级二级二等奖':
            self.max_score = 8
        elif self.levels == '省级二级三等奖':
            self.max_score = 5
        elif self.levels == '省级二级其它奖':
            self.max_score = 4
        elif self.levels == '省级三级一等奖':
            self.max_score = 8
        elif self.levels == '省级三级二等奖':
            self.max_score = 5
        elif self.levels == '省级三级三等奖':
            self.max_score = 3
        elif self.levels == '省级三级其它奖':
            self.max_score = 2.5
        elif self.levels == '市厅级一等奖':
            self.max_score = 5
        elif self.levels == '市厅级二等奖':
            self.max_score = 3
        elif self.levels == '市厅级三等奖':
            self.max_score = 2
        elif self.levels == '市厅级其它奖':
            self.max_score = 1.5
        elif self.levels == '校赛一等奖':
            self.max_score = 1
        elif self.levels == '校赛二等奖':
            self.max_score = 0.8
        elif self.levels == '校赛三等奖':
            self.max_score = 0.6
        elif self.levels == '校赛其它奖':
            self.max_score = 0.3

        if not self.is_first_unit:
            self.max_score = self.max_score / 2
        return self.max_score


"""
讲座/座谈/分享	在学校层面每开展一次讲座/分享/主题报告/座谈加3分
做为主讲人面向系部开展分享/座谈/培训，加1分/次；需提供相应宣传材料、图片等
说明：
1.学校层面的须在教务处备案，系部层面需在系部备份。
2.由多人、多部门组织的讲座和报告，教师自行商定加分，且不超过该项总分。
"""


# 讲座培训
class Training(BaseModel):
    class Meta:
        verbose_name = '主持培训/讲座/会议'
        verbose_name_plural = '主持培训/讲座/会议'
    input_info = """
 这里是开展讲座的内容，讲座可以由多位老师联合开展，由其中一位当该项负责人填报。
讲座/座谈/分享	在学校层面每开展一次讲座/分享/主题报告/座谈加3分
做为主讲人面向系部开展分享/座谈/培训，加1分/次；需提供相应宣传材料、图片等
说明：
1.学校层面的须在教务处备案，系部层面需在系部备份。
2.由多人、多部门组织的讲座和报告，教师自行商定加分，且不超过该项总分。
"""

    # 培训名
    name = models.CharField(max_length=255, verbose_name='讲座/座谈/分享主题')
    # 内容/名称 字段
    content = models.TextField(verbose_name='内容/名称')
    # 面向对象为学校还是系部
    target = models.CharField(max_length=10, choices=(('学校', '学校'), ('系部', '系部')), verbose_name='面向目标')
    # 时间 字段，使用DateTimeField存储具体的时间
    time = models.DateTimeField(verbose_name='工作时间')

    def get_max_score(self):
        try:
            self.max_score = 0
            if self.target == '学校':
                self.max_score = 3
            elif self.target == '系部':
                self.max_score = 1
            return self.max_score
        except Exception as e:
            return {'error': str(e)}


"""
其他	撰写一篇学校级别新闻稿，3分
	撰写一篇市厅级及以上级别新闻稿，10分
	担任集团及以上级别学生竞赛和教学竞赛评委，按照竞赛成果级别的2倍加分
	担任集团及以上级别项目立项和结题评审，按照项目结题相应级别加分

"""


# 撰写新闻稿
class News(BaseModel):
    class Meta:
        verbose_name = '新闻稿'
        verbose_name_plural = '新闻稿'
    input_info = """
    这是多人项目，一篇新闻稿件可以是多人填写，有你们自己指定一位填写并分配分数
其他	撰写一篇学校级别新闻稿，3分
	撰写一篇市厅级及以上级别新闻稿，10分
	担任集团及以上级别学生竞赛和教学竞赛评委，按照竞赛成果级别的2倍加分
	担任集团及以上级别项目立项和结题评审，按照项目结题相应级别加分

"""

    # 新闻稿标题
    name = models.CharField(max_length=255, verbose_name='新闻稿名')

    # 新闻稿级别，可以为空，choices为（校级，市厅级以上)
    news_level = models.CharField(max_length=10, choices=(('校级', '校级'), ('市厅级以上', '市厅级以上')),
                                  verbose_name='新闻稿级别')
    # 新闻稿摘要
    summary = models.TextField(verbose_name='新闻稿摘要')
    # 新闻稿链接
    link = models.URLField(verbose_name='新闻稿链接')

    def get_max_score(self):
        try:
            self.max_score = 0
            if self.news_level == '校级':
                self.max_score = 3
            elif self.news_level == '市厅级以上':
                self.max_score = 10
            return self.max_score
        except Exception as e:
            return {'error': str(e)}


"""
担任集团及以上级别学生竞赛评委
国一40*2，国二30*2，国三25*2
省一18*2，省二12*2，省三8*2
市厅级（集团）3*2
 担任集团及以上教学竞赛评委
市厅级25*2
省级35*2
国家级50*2
集团级15*2

教科研项评委
市厅级，15分
省级，30分
国家级，75分
集团级，10分

创新创业评委
市厅级结题，7.5分
省级结题，15分
国家级结题，30分
"""


# 评委
class Judge(BaseModel):
    class Meta:
        verbose_name = '评委'
        verbose_name_plural = '评委'
    input_info = """
    这个是单人项目，自己写自己的。
担任集团及以上级别学生竞赛评委
国一40*2，国二30*2，国三25*2
省一18*2，省二12*2，省三8*2
市厅级（集团）3*2
 担任集团及以上教学竞赛评委
市厅级25*2
省级35*2
国家级50*2
集团级15*2

教科研项评委
市厅级，15分
省级，30分
国家级，75分
集团级，10分

创新创业评委
市厅级结题，7.5分
省级结题，15分
国家级结题，30分
"""

    # 评委事务名称
    name = models.CharField(max_length=255, verbose_name='评委事务名称')
    # 工作内容
    content = models.TextField(verbose_name='工作内容')
    # 评委类型
    judge_type = models.CharField(max_length=10, choices=(
        ('学生竞赛', '学生竞赛'), ('教师竞赛', '教师竞赛'), ('创新创业项目', '创新创业项目'), ('科研项目', '科研项目')),
                                  verbose_name='评委类型')
    # 担任教师竞赛的评委级别，可以为空，choices为教师竞赛模型的levels的choices
    judge_level = models.CharField(max_length=10, choices=(
        ('国家一级学生竞赛', '国家一级学生竞赛'), ('国家二级学生竞赛', '国家二级学生竞赛'),
        ('国家三级学生竞赛', '国家三级学生竞赛'), ('省级一级学生竞赛', '省级一级学生竞赛'),
        ('省级二级学生竞赛', '省级二级学生竞赛'), ('省级三级学生竞赛', '省级三级学生竞赛'),
        ('市厅级学生竞赛', '市厅级学生竞赛'), ('校级学生竞赛', '校级学生竞赛'), ('国家级教师竞赛', '国家级教师竞赛'),
        ('省级教师竞赛', '省级教师竞赛'), ('市厅级教师竞赛', '市厅级教师竞赛'), ('集团级教师竞赛', '集团级教师竞赛'),
        ('校级教师竞赛', '校级教师竞赛'), ('国家级创新创业项目', '国家级创新创业项目'),
        ('省级创新创业项目', '省级创新创业项目'), ('市厅级创新创业项目', '市厅级创新创业项目'),
        ('校级创新创业项目', '校级创新创业项目'), ('集团级科研项目', '集团级科研项目'),
        ('国家级科研项目', '国家级科研项目'), ('省级科研项目', '省级科研项目'), ('市厅级科研项目', '市厅级科研项目'),
        ('集团级科研项目', '集团级科研项目'), ('校级科研项目', '校级科研项目'),), verbose_name='评委事项级别')

    def get_max_score(self):
        self.max_score = 0
        if self.judge_type == '学生竞赛':
            if self.judge_level == '国家一级学生竞赛':
                self.max_score = 40 * 2
            elif self.judge_level == '国家二级学生竞赛':
                self.max_score = 30 * 2
            elif self.judge_level == '国家三级学生竞赛':
                self.max_score = 25 * 2
            elif self.judge_level == '省级一级学生竞赛':
                self.max_score = 18 * 2
            elif self.judge_level == '省级二级学生竞赛':
                self.max_score = 12 * 2
            elif self.judge_level == '省级三级学生竞赛':
                self.max_score = 8 * 2
            elif self.judge_level == '市厅级学生竞赛':
                self.max_score = 3 * 2
            elif self.judge_level == '校级学生竞赛':
                self.max_score = 1 * 2
        elif self.judge_type == '教师竞赛':
            if self.judge_level == '国家级教师竞赛':
                self.max_score = 50
            elif self.judge_level == '省级教师竞赛':
                self.max_score = 35
            elif self.judge_level == '市厅级教师竞赛':
                self.max_score = 25
            elif self.judge_level == '集团级教师竞赛':
                self.max_score = 15
            elif self.judge_level == '校级教师竞赛':
                self.max_score = 10
        elif self.judge_type == '创新创业项目':
            if self.judge_level == '国家级创新创业项目':
                self.max_score = 75
            elif self.judge_level == '省级创新创业项目':
                self.max_score = 30
            elif self.judge_level == '市厅级创新创业项目':
                self.max_score = 15
            elif self.judge_level == '校级创新创业项目':
                self.max_score = 5
        elif self.judge_type == '科研项目':
            if self.judge_level == '国家级科研项目':
                self.max_score = 50
            elif self.judge_level == '省级科研项目':
                self.max_score = 35
            elif self.judge_level == '市厅级科研项目':
                self.max_score = 15
            elif self.judge_level == '集团级科研项目':
                self.max_score = 10
            elif self.judge_level == '校级科研项目':
                self.max_score = 5
        return self.max_score


"""
	组织学生参观企业或者老师走访企业，3分/次
"""


# 组织学生参观企业或者老师走访企业
class EnterpriseVisit(BaseModel):
    class Meta:
        verbose_name = '参观企业'
        verbose_name_plural = '参观企业'
    input_info = """
    这个是单人项目，自己写自己的
	组织学生参观企业或者老师走访企业，3分/次
"""
    # 参观企业名
    name = models.CharField(max_length=50, verbose_name='参观企业名')
    # 参观企业地址
    address = models.CharField(max_length=50, verbose_name='参观企业地址')
    # 参观企业简介
    introduction = models.CharField(max_length=50, verbose_name='参观企业简介')
    # 参观时间
    time = models.DateTimeField(verbose_name='参观时间')

    def get_max_score(self):
        self.max_score = 3
        return self.max_score


"""
党建工作	协助完成上级党委、党总支要求开展的会议，学习，活动，交流，研学，宣传等党建工作，每次加0.5分
	协助完成党支部工作手册记录，组织关系转接，党员档案整理，撰写党务材料，迎接巡视检查等党建工作，每次加0.5分
	提交入党申请书加0.5分 ，获得入党积极分子名额加0.5分，获得发展预备党员资格加0.5分，按期转为正式党员加0.5分
	获得年度民主评议优秀共产党员者，加1分
"""


# 党建工作
class PartyWork(BaseModel):
    class Meta:
        verbose_name = '党建工作'
        verbose_name_plural = '党建工作'
    input_info = """
    这是是单人项目
党建工作	协助完成上级党委、党总支要求开展的会议，学习，活动，交流，研学，宣传等党建工作，每次加0.5分
	协助完成党支部工作手册记录，组织关系转接，党员档案整理，撰写党务材料，迎接巡视检查等党建工作，每次加0.5分
	提交入党申请书加0.5分 ，获得入党积极分子名额加0.5分，获得发展预备党员资格加0.5分，按期转为正式党员加0.5分
	获得年度民主评议优秀共产党员者，加1分
"""

    # 帮助完成上级党委、党总支要求开展的会议，学习，活动，交流，研学，宣传等党建工作，每次加0.5分
    help_complete_meeting = models.IntegerField(verbose_name='帮助完成会议次数', default=0)
    # 协助完成党支部工作手册记录，组织关系转接，党员档案整理，撰写党务材料，迎接巡视检查等党建工作，每次加0.5分
    help_complete_work = models.IntegerField(verbose_name='帮助完成工作手册次数', default=0)
    # 是否提交入党申请书
    submit_application = models.BooleanField(verbose_name='提交入党申请书', default=False)
    # 是否获得入党积极分子名额
    get_activist_quota = models.BooleanField(verbose_name='获得入党积极分子名额', default=False)
    # 是否获得发展预备党员资格
    get_development_quota = models.BooleanField(verbose_name='获得发展预备党员资格', default=False)
    # 是否获得年度民主评议优秀共产党员者
    get_excellent_activist = models.BooleanField(verbose_name='获得年度民主评议优秀共产党员者', default=False)

    def get_max_score(self):
        self.max_score = 0
        self.max_score = 0.5 * self.help_complete_meeting + 0.5 * self.help_complete_work
        if self.submit_application:
            self.max_score += 0.5
        if self.get_activist_quota:
            self.max_score += 0.5
        if self.get_development_quota:
            self.max_score += 0.5
        if self.get_excellent_activist:
            self.max_score += 1
        return self.max_score


"""
招生/迎新宣传资料/就业指南/招生简章制作等	参与相关专业材料制作根据工作量加1-2分
"""


# 招生
class Recruitment(BaseModel):
    class Meta:
        verbose_name = '招生'
        verbose_name_plural = '招生'
    input_info = """
    这也是单人项目，自己写自己的
招生/迎新宣传资料/就业指南/招生简章制作等	参与相关专业材料制作根据工作量加1-2分
"""

    # 工作起止时间
    time = models.DateTimeField(verbose_name='时间')
    # 工作内容简介
    content = models.TextField(verbose_name='工作内容')

    def get_max_score(self):
        self.max_score = 2
        return self.max_score


"""
专业介绍会/就业动员会/专业方向介绍会	
一共五分
负责人填报
"""


# 专业介绍会
class ProfessionalIntroduction(BaseModel):
    class Meta:
        verbose_name = '专业介绍会'
        verbose_name_plural = '专业介绍会'
    input_info = """
这个是多人项目，由每一次的负责人填报并分配分数
专业介绍会/就业动员会/专业方向介绍会	
一共五分
负责人填报
"""

    # 工作起止时间
    time = models.DateTimeField(verbose_name='时间')
    # 工作内容简介
    content = models.TextField(verbose_name='工作内容')

    def get_max_score(self):
        self.max_score = 5
        return self.max_score


"""
迎新工作（接待、咨询等）	0.5分/半天
这里以半天为一条记录次计算
如果干了一天 就写两条记录
"""


# 迎新
class WelcomeWork(BaseModel):
    class Meta:
        verbose_name = '迎新工作'
        verbose_name_plural = '迎新工作'
    input_info = """
这个是多人项目，由每一次的负责人填报并分配分数
专业介绍会/就业动员会/专业方向介绍会	
一共五分
负责人填报
"""

    # 迎新时间
    time = models.DateTimeField(verbose_name='时间')
    # 工作内容简介
    content = models.TextField(verbose_name='工作内容')

    def get_max_score(self):
        self.max_score = 0.5
        return self.max_score


"""
这是单人项目，自己写自己面试了多少人就行
新教师面试	对接人次≤20人，0.3分/人，对接人次>20人，超出部分按0.4分/次
面试0.5分/人，由面试总负责人根据每次实际情况分配分数
"""

# 新教师面试
class NewTeacherInterview(BaseModel):
    class Meta:
        verbose_name = '新教师面试'
        verbose_name_plural = '新教师面试'
    input_info = """
这是单人项目，自己写自己面试了多少人就行
新教师面试	对接人次≤20人，0.3分/人，对接人次>20人，超出部分按0.4分/次
面试0.5分/人，由面试总负责人根据每次实际情况分配分数
"""

    # 面试时间
    time = models.DateTimeField(verbose_name='时间')
    # 面试人数
    number = models.IntegerField(verbose_name='面试人数')
    # 对接人数
    connect_number = models.IntegerField(verbose_name='对接人数')

    def get_max_score(self):
        self.max_score = 0
        if self.connect_number <= 20:
            self.max_score = 0.3 * self.connect_number
        else:
            self.max_score = 0.4 * (self.connect_number - 20) + 0.3 * 20

        self.max_score += self.number * 0.5
        return self.max_score


"""

老带新和新教师培训培养	

1.担任新入职教师老带新老师，按照老带新的工作职责完成新老师的指导工作，视完成情况加0-2分/人/学期，直至教师转正
2.导师需在学期结束后提交老带新工作总结
注：学校安排的老带新不算在此项

"""


# 老带新教师
class NewTeacherTrain(BaseModel):
    class Meta:
        verbose_name = '新教师培训培养'
        verbose_name_plural = '新教师培训培养'
    input_info = """
这是单人项目，自己写自己就行了
老带新和新教师培训培养	

1.担任新入职教师老带新老师，按照老带新的工作职责完成新老师的指导工作，视完成情况加0-2分/人/学期，直至教师转正
2.导师需在学期结束后提交老带新工作总结
注：学校安排的老带新不算在此项

"""

    # 工作内容简介
    content = models.TextField(verbose_name='工作内容')
    # 是否学校安排 默认为否
    is_school_arrange = models.BooleanField(verbose_name='是否学校安排', default=False)

    def get_max_score(self):
        self.max_score = 0
        if self.is_school_arrange:
            self.max_score = 0
        else:
            self.max_score = 2
        return self.max_score


"""
优秀人才/讲座主讲人/引荐	1.每推荐1名特殊高级人才加3-20分；
2.介绍、联系讲座主讲人并成功开展讲座加3分/人次（包括前期联系，接待，报销等全部）
"""


# 优秀人才/讲座主讲人
class ExcellentTalent(BaseModel):
    class Meta:
        verbose_name = '引荐优秀人才/讲座主讲人'
        verbose_name_plural = '引荐优秀人才/讲座主讲人'
    input_info = """
    这是单人项目 相关人员那里添加自己为负责人就行了
优秀人才/讲座主讲人/引荐	1.每推荐1名特殊高级人才加3-20分；
2.介绍、联系讲座主讲人并成功开展讲座加3分/人次（包括前期联系，接待，报销等全部）
"""

    # 推荐数量
    recommend_num = models.IntegerField(verbose_name='推荐人才数量')
    # 推荐人开设讲座次数
    lecture_num = models.IntegerField(verbose_name='讲座次数')

    def get_max_score(self):
        self.max_score = 0
        if self.recommend_num <= 10:
            self.max_score = 3 * self.recommend_num
        else:
            self.max_score = 20 * (self.recommend_num - 10)
        if self.lecture_num > 0:
            self.max_score += 3 * self.lecture_num
        return self.max_score


"""
额外监考	额外监考指需要系部额外安排的考试监考，
如竞赛、大创答辩，转专业面试/笔试等无监考费的额外监考，
加0.5分/次（期末监考、四六级、计算机二级、开学补考、专升本等常规工作内容除外）
"""


# 额外监考
class ExtraInspection(BaseModel):
    class Meta:
        verbose_name = '额外监考'
        verbose_name_plural = '额外监考'
    input_info = """
这是单人项目 相关人员那里添加自己为负责人就行了
额外监考	额外监考指需要系部额外安排的考试监考，
如竞赛、大创答辩，转专业面试/笔试等无监考费的额外监考，
加0.5分/次（期末监考、四六级、计算机二级、开学补考、专升本等常规工作内容除外）
"""

    # 监考时间
    time = models.DateTimeField(verbose_name='时间')
    # 监考内容
    content = models.TextField(verbose_name='监考内容')

    def get_max_score(self):
        self.max_score = 0.5
        return self.max_score


"""
会议/讲座/培训	
    参加学校安排的非全体教师参与的会议/讲座，如：说课比赛观摩，“金课”交流会等；加0.5分/次；
	集团、学校额外要求的，非全体教师参加的培训（教学常规、制度等强行要求的培训不纳入），加1分/次，获得资格证书者在加0.5分/证
	校外线下培训加2分/次；若获得对应的研修或进修证书再加1分
	说明：
1.所有培训或研修，须是真正学习的培训，而不是娱乐的培训
2.须提交会议通知文件，参会回执，缴费单据，研修证明等佐证材料
"""


# 学校的会议/讲座/培训
class SchoolMeeting(BaseModel):
    class Meta:
        verbose_name = '参加会议/讲座/培训'
        verbose_name_plural = '参加会议/讲座/培训'
    input_info = """
这是单人项目 相关人员那里添加自己为负责人就行了
会议/讲座/培训	
    参加学校安排的非全体教师参与的会议/讲座，如：说课比赛观摩，“金课”交流会等；加0.5分/次；
	集团、学校额外要求的，非全体教师参加的培训（教学常规、制度等强行要求的培训不纳入），加1分/次，获得资格证书者在加0.5分/证
	校外线下培训加2分/次；若获得对应的研修或进修证书再加1分
	说明：
1.所有培训或研修，须是真正学习的培训，而不是娱乐的培训
2.须提交会议通知文件，参会回执，缴费单据，研修证明等佐证材料
"""

    # 会议名称
    name = models.CharField(max_length=255, verbose_name='会议名称')
    # 会议时间
    time = models.DateTimeField(verbose_name='时间')
    # 会议类型 choices为会议/讲座/培训
    type = models.CharField(max_length=255, verbose_name='会议类型', choices=(
        ('非全体教师参与的会议/讲座', '非全体教师参与的会议/讲座'), ('非全体教师参加的培训', '非全体教师参加的培训'),
        ('校外线下培训', '校外线下培训')))
    # 是否获得证书
    is_get_certificate = models.BooleanField(verbose_name='是否获得证书', default=False)
    # 主要内容
    content = models.TextField(verbose_name='主要内容')

    def get_max_score(self):
        self.max_score = 0
        if self.type == '非全体教师参与的会议/讲座':
            self.max_score = 0.5
            if self.is_get_certificate:
                self.max_score += 0.5
        elif self.type == '非全体教师参加的培训':
            self.max_score = 1
            if self.is_get_certificate:
                self.max_score += 0.5
        elif self.type == '校外线下培训':
            self.max_score = 2
            if self.is_get_certificate:
                self.max_score += 1

        return self.max_score


"""
工作室	所有成员加5分，由工作室负责人负责分配
"""


# 工作室
class WorkGroup(BaseModel):
    class Meta:
        verbose_name = '工作室'
        verbose_name_plural = '工作室'
    input_info = """
这是单人项目 相关人员那里添加自己为负责人就行了
工作室	所有成员加5分，由工作室负责人负责分配
"""

    # 工作内容简介
    content = models.TextField(verbose_name='工作内容')

    def get_max_score(self):
        self.max_score = 10
        return self.max_score


"""
系部网站建设与公众号建设	
1.网站建设和公众号及新媒体总负责人加3分/学期，所发推文不再进行加分 #这部分内容直接再其它项加分
2.推文，包括前期资料准备和发布，按时效和质量加0.5-1分/篇，撰写简讯加0.5分/篇，不同推文可累加，同一事件推文和简讯按最高加
3.负责人未按时提交系部宣传工作总结材料者该项不加分
"""


# 系部网站建设与公众号建设


class Website(BaseModel):
    class Meta:
        verbose_name = '系部网站建设与公众号建设'
        verbose_name_plural = '系部网站建设与公众号建设'
    input_info = """
这是多人项目 每项工作可能有多人完成，又你们自己商量谁是负责人再分配分数
系部网站建设与公众号建设	
1.网站建设和公众号及新媒体总负责人加3分/学期，所发推文不再进行加分 #这部分内容直接再其它项加分
2.推文，包括前期资料准备和发布，按时效和质量加0.5-1分/篇，撰写简讯加0.5分/篇，不同推文可累加，同一事件推文和简讯按最高加
3.负责人未按时提交系部宣传工作总结材料者该项不加分
"""

    # 网站或公众号名称
    name = models.CharField(max_length=255, verbose_name='推文或简讯名')
    # 工作时间
    time = models.DateTimeField(verbose_name='时间')
    # 工作内容简介
    content = models.TextField(verbose_name='工作内容')
    # 工作效果，choices 高级推文 1分/篇，普通推文 0.5分/篇，简讯 0.5分/篇
    effect = models.CharField(max_length=255, verbose_name='工作效果',
                              choices=(('高级推文', '高级推文'), ('普通推文', '普通推文'), ('简讯', '简讯')))
    # 是网站或者公众号总负责人？
    is_total_manager = models.BooleanField(verbose_name='是否网站或公众号总负责人', default=False)

    def get_max_score(self):
        self.max_score = 0
        if self.is_total_manager:
            self.max_score = 3
        else:
            if self.effect == '高级推文':
                self.max_score = 1
            elif self.effect == '普通推文':
                self.max_score = 0.5
            elif self.effect == '简讯':
                self.max_score = 0.5

        return self.max_score


"""
系部员工活动举办	加3-6分/次,由总负责人负责分配
"""


# 系部员工活动举办/参与
class Activity(BaseModel):
    class Meta:
        verbose_name = '系部员工活动举办'
        verbose_name_plural = '系部员工活动举办'
    input_info = """
这是多人项，每一项可以由多人合作完成，由你们自己选负责人分配。
系部员工活动举办	加3-6分/次,由总负责人负责分配
"""

    # 活动名称
    name = models.CharField(max_length=255, verbose_name='活动名称')
    # 活动时间
    time = models.DateTimeField(verbose_name='时间')
    # 活动内容
    content = models.TextField(verbose_name='活动内容')

    def get_max_score(self):
        self.max_score = 6
        return self.max_score


"""
课程建设	内容包括但不仅限于：新建课程，对已经建设的课程进行修改和完善，添加视频、教案、作业、习题、制作PPT等，按完成情况加0-4分（由课程负责人分配）
"""


# 课程建设
class Course(BaseModel):
    class Meta:
        verbose_name = '课程建设'
        verbose_name_plural = '课程建设'
    input_info = """
这是多人项，每一项可以由多人合作完成，由你们自己选负责人分配。
课程建设	内容包括但不仅限于：新建课程，对已经建设的课程进行修改和完善，添加视频、教案、作业、习题、制作PPT等，按完成情况加0-4分（由课程负责人分配）
"""

    # 课程名称
    name = models.CharField(max_length=255, verbose_name='课程名称')
    # 所属学年与学期
    year = models.CharField(max_length=255, verbose_name='所属学年')
    # 所属学期
    semester = models.CharField(max_length=255, verbose_name='所属学期', choices=(('春季', '春季'), ('秋季', '秋季')))
    # 课程内容
    content = models.TextField(verbose_name='课程内容')

    def get_max_score(self):
        self.max_score = 4
        return self.max_score


"""
临时性工作	1.临时接手离职老师/休假老师课程，8周内加2分/门，超过8周加3分/门
2.临时接手离职老师/休假老师课程资料，如：改卷、录分、整理教学资料，根据工作量加0.5-2分/门
"""


# 临时性工作
class TemporaryWork(BaseModel):
    class Meta:
        verbose_name = '临时性工作'
        verbose_name_plural = '临时性工作'
    input_info = """
这是多人项，每一项可以由多人合作完成，由你们自己选负责人分配。
临时性工作	1.临时接手离职老师/休假老师课程，8周内加2分/门，超过8周加3分/门
2.临时接手离职老师/休假老师课程资料，如：改卷、录分、整理教学资料，根据工作量加0.5-2分/门
"""

    # 临时性工作名称
    name = models.CharField(max_length=255, verbose_name='临时性工作名称')
    # 工作时间
    time = models.DateTimeField(verbose_name='时间')
    # 临时性工作内容
    content = models.TextField(verbose_name='临时性工作内容')
    # 工作性质 choices接手课程超8周、接手课程未超过8周、接手其它事项
    nature = models.CharField(max_length=255, verbose_name='工作性质', choices=(
        ('接手课程超8周', '接手课程超8周'), ('接手课程未超过8周', '接手课程未超过8周'),
        ('接手其它事项', '接手其它事项')),
                              default='')

    def get_max_score(self):
        self.max_score = 0
        if self.nature == '接手课程超8周':
            self.max_score = 3
        elif self.nature == '接手课程未超过8周':
            self.max_score = 2
        elif self.nature == '接手其它事项':
            self.max_score = 2
        return self.max_score


"""
参与系部建设	1.毕业论文指导组组长加0-8分/组
2.系部优秀毕业论文指导教师，加0.5分/生；学院优秀毕业论文指导教师加1分/生
3.参与抽查人员每次加2-4分/次：如：教学资料交叉检查；论文资料抽查等
4.参与研讨提供建设性意见并采纳加0.5分/次；如：毕设工作中“一致性声明”提议
"""


# 参与 系部 建设
class Participate(BaseModel):
    class Meta:
        verbose_name = '参与系部建设'
        verbose_name_plural = '参与系部建设'
    input_info = """
这是多人项，每一项可以由多人合作完成，由你们自己选负责人分配。
参与系部建设	1.毕业论文指导组组长加0-8分/组
2.系部优秀毕业论文指导教师，加0.5分/生；学院优秀毕业论文指导教师加1分/生
3.参与抽查人员每次加2-4分/次：如：教学资料交叉检查；论文资料抽查等
4.参与研讨提供建设性意见并采纳加0.5分/次；如：毕设工作中“一致性声明”提议
"""

    # 参与系部建设名称
    name = models.CharField(max_length=255, verbose_name='参与系部建设名称')
    # 工作时间
    time = models.DateTimeField(verbose_name='时间')

    # 建设类型
    nature = models.CharField(max_length=255, verbose_name='建设类型', choices=(
        ('毕业论文指导组组长', '毕业论文指导组组长'), ('系部优秀毕业论文指导教师', '系部优秀毕业论文指导教师'),
        ('参与抽查人员', '参与抽查人员'), ('参与研讨', '参与研讨'), ('毕设指导', '毕设指导')))

    # 参与系部建设内容
    content = models.TextField(verbose_name='参与系部建设内容')

    # 次数
    times = models.IntegerField(verbose_name='人/次数', default=0)

    def get_max_score(self):
        self.max_score = 0
        if self.nature == '毕业论文指导组组长':
            self.max_score = 8
        elif self.nature == '系部优秀毕业论文指导教师':
            self.max_score = 1 * self.times
        elif self.nature == '参与抽查人员':
            self.max_score = 2 * self.times
        elif self.nature == '参与研讨':
            self.max_score = 0.5 * self.times
        elif self.nature == '毕设指导':
            self.max_score = 0.05 * self.times
        return self.max_score


"""
访企拓岗与就业工作	1.推荐单位招聘：单位岗位需求可长期合作，不同单位可累加，按3+0.2*招聘录取人数
2.推荐学生成功就业（学生自行就业不算），每年5月底前签订三方或劳动合同，加1分/生
3.毕业实习指导学生成功就业（三方、合同等）加0.2分/人
"""


# 访企拓岗与就业工作
class Visit(BaseModel):
    class Meta:
        verbose_name = '访企拓岗与就业工作'
        verbose_name_plural = '访企拓岗与就业工作'
    input_info = """
    这是单人项。写自己的情况就行，添加自己是相关人员
访企拓岗与就业工作	1.推荐单位招聘：单位岗位需求可长期合作，不同单位可累加，按3+0.2*招聘录取人数
2.推荐学生成功就业（学生自行就业不算），每年5月底前签订三方或劳动合同，加1分/生
3.毕业实习指导学生成功就业（三方、合同等）加0.2分/人
"""

    # 推荐单位招聘人数
    recruit_num = models.IntegerField(verbose_name='招聘人数')
    # 毕业实习指导学生成功就业人数
    intern_num = models.IntegerField(verbose_name='毕业实习指导学生成功就业人数')
    # 推荐就业人数
    employ_num = models.IntegerField(verbose_name='推荐就业人数')

    def get_max_score(self):
        self.max_score = 0
        self.max_score = 3 + 0.2 * self.recruit_num + self.intern_num + self.employ_num * 0.2
        return self.max_score


"""
跨课门数和课程难度系数	
专业课难度系数为1.1；
公共课为1
公共课合班人数≤50人，难度系数1，合班人数>50人,难度系数1.05
self.max_score =(all_num-1)*(self.common_course_num1 + self.common_class_num2 * 1.05 + self.major_course_num * 1.1)/all_num
"""


# 跨课门数和课程难度系数
class CrossCourse(BaseModel):
    class Meta:
        verbose_name = '跨课门数和课程难度系数'
        verbose_name_plural = '跨课门数和课程难度系数'
    input_info ="""
    这是单人项，自己写自己的，添加自己是相关人员即可
跨课门数和课程难度系数	
专业课难度系数为1.1；
公共课为1
公共课合班人数≤50人，难度系数1，合班人数>50人,难度系数1.05
self.max_score =(all_num-1)*(self.common_course_num1 + self.common_class_num2 * 1.05 + self.major_course_num * 1.1)/all_num
"""

    # 课程名
    name = models.CharField(max_length=255, verbose_name='所有的课程名')
    # 课程号
    course_num = models.CharField(max_length=255, verbose_name='所有的课程号')
    # 公共课数量
    common_course_num1 = models.IntegerField(verbose_name='公共课数量(人数<50)', default=0)
    # 共课中合班人数>=50人的课程数
    common_course_num2 = models.IntegerField(verbose_name='公共课数量(人数>=50)', default=0)
    # 专业课数量
    major_course_num = models.IntegerField(verbose_name='专业课数量', default=0)

    def get_max_score(self):
        self.max_score = 0
        all_num = self.common_course_num1 + self.common_course_num2 + self.major_course_num
        self.max_score = (all_num - 1) * (
                self.common_course_num1 + self.common_course_num2 * 1.05 + self.major_course_num * 1.1) / all_num

        return self.max_score


"""
教科研获奖	
    校级三等奖及以下，5分
	校级二等奖，8分
	校级一等奖，15分
	市厅级三等奖及以下，8分
	市厅级二等奖，15分
	市厅级一等奖，25分
	省级三等奖及以下，15分
	省级二等奖，25分
	省级一等奖，35分
	国家级三等奖及以下，35分
	国家级二等奖，50分
	国家级一等奖，80分
	集团级三等奖及以下，5分
	集团级二等奖，8分
	集团级一等奖，15分
	说明：
1.项目须以学校为第一作者单位，省级、国家级项目学校作为参与单位的，按项目分数折半加分。
2.由多人、多部门参与的项目，教师自行商定加分，且不超过项目总分。
"""


# 教科研获奖
class ResearchAward(BaseModel):
    class Meta:
        verbose_name = '教科研获奖'
        verbose_name_plural = '教科研获奖'
    input_info = """
这个可以是多人项，如果多人持有同一个奖项，可以自己选个负责人 取填写
教科研获奖	
    校级三等奖及以下，5分
	校级二等奖，8分
	校级一等奖，15分
	市厅级三等奖及以下，8分
	市厅级二等奖，15分
	市厅级一等奖，25分
	省级三等奖及以下，15分
	省级二等奖，25分
	省级一等奖，35分
	国家级三等奖及以下，35分
	国家级二等奖，50分
	国家级一等奖，80分
	集团级三等奖及以下，5分
	集团级二等奖，8分
	集团级一等奖，15分
	说明：
1.项目须以学校为第一作者单位，省级、国家级项目学校作为参与单位的，按项目分数折半加分。
2.由多人、多部门参与的项目，教师自行商定加分，且不超过项目总分。
"""

    # 奖项名
    name = models.CharField(max_length=255, verbose_name='奖项名称')
    # 奖励级别
    level = models.CharField(max_length=255, verbose_name='奖励级别', choices=(
        ('校级三等奖及以下', '校级三等奖及以下'), ('校级二等奖', '校级二等奖'), ('校级一等奖', '校级一等奖'),
        ('市厅级三等奖及以下', '市厅级三等奖及以下'), ('市厅级二等奖', '市厅级二等奖'),
        ('市厅级一等奖', '市厅级一等奖'),
        ('省级三等奖及以下', '省级三等奖及以下'), ('省级二等奖', '省级二等奖'), ('省级一等奖', '省级一等奖'),
        ('国家级三等奖及以下', '国家级三等奖及以下'), ('国家级二等奖', '国家级二等奖'),
        ('国家级一等奖', '国家级一等奖'),
        ('集团级三等奖及以下', '集团级三等奖及以下'), ('集团级二等奖', '集团级二等奖'),
        ('集团级一等奖', '集团级一等奖')))
    # 是否是本校为第一单位
    is_first_unit = models.BooleanField(verbose_name='是否本校为第一单位', default=True)

    # 获奖时间
    time = models.DateTimeField(verbose_name='获奖时间')

    def get_max_score(self):
        self.max_score = 0
        if self.level == '校级三等奖及以下':
            self.max_score = 5
        elif self.level == '校级二等奖':
            self.max_score = 8
        elif self.level == '校级一等奖':
            self.max_score = 15
        elif self.level == '市厅级三等奖及以下':
            self.max_score = 8
        elif self.level == '市厅级二等奖':
            self.max_score = 15
        elif self.level == '市厅级一等奖':
            self.max_score = 25
        elif self.level == '省级三等奖及以下':
            self.max_score = 15
        elif self.level == '省级二等奖':
            self.max_score = 25
        elif self.level == '省级一等奖':
            self.max_score = 35
        elif self.level == '国家级三等奖及以下':
            self.max_score = 35
        elif self.level == '国家级二等奖':
            self.max_score = 50
        elif self.level == '国家级一等奖':
            self.max_score = 80
        elif self.level == '集团级三等奖及以下':
            self.max_score = 5
        elif self.level == '集团级二等奖':
            self.max_score = 8
        elif self.level == '集团级一等奖':
            self.max_score = 15
        if not self.is_first_unit:
            self.max_score = self.max_score / 2
        return self.max_score


"""
论文、报告	
    SCI/SSCI检索收录1区40分/篇
	SCI/SSCI检索收录2区30分/篇
	SCI/SSCI检索收录3区15分/篇
	SCI/SSCI检索收录4区10分/篇
	EI/A@HCI检索收录20分/篇
	C刊检索收录20分/篇
	C扩检索收录15分/篇
	CSCD检索收录18分/篇
	北核，15分/篇
	普刊，知网收录5分/篇
	普刊，维普、万方收录3分/篇
	
	被国家级刊物转载、专题评论30分/篇
	学校以第一作者单位相关报告被市厅级单位正面批复、评价的每篇加20分/篇
	学校以第一作者单位相关报告被省部级单位正面批复、评价的每篇加50分/篇
	教师以第一作者身份撰写的教改论文等提交到系部0.5分/篇（需符合主题），系部筛选提交到学校，1分/篇，被学校收录，每篇加2分
	说明：
1.论文、报告成果由多人参与的，教师自主协商加分，且不超过该项总分。
2.所有成果须在学校科技处、教务处备案。3.论文成果须以学校为第一作者单位，国际顶级期刊论文，学校作为参与单位的，该项成果折半加分（本条可以忽略）。
4.论文期刊被多个检索收录的，只加分一次，取大值。
5.由多人、多部门参与的成果，教师自行商定加分，且不超过项目总分。
负责人通常指论文作者第一顺位的老师,即论文作者为 A  B  C  D  E 五人 若A B 不是系部老师 C E是系部老师 则author只需填写C E  且C为负责人
负责人如果为第一作者则系数为1，通讯作者为0.8，其它作者为0.5

"""


# 论文
class Paper(BaseModel):
    class Meta:
        verbose_name = '论文'
        verbose_name_plural = '论文'
    input_info = """
多人项，由顺位最高的作者当负责人填写并分配
论文、报告	
    SCI/SSCI检索收录1区40分/篇
	SCI/SSCI检索收录2区30分/篇
	SCI/SSCI检索收录3区15分/篇
	SCI/SSCI检索收录4区10分/篇
	EI/A@HCI检索收录20分/篇
	C刊检索收录20分/篇
	C扩检索收录15分/篇
	CSCD检索收录18分/篇
	北核，15分/篇
	普刊，知网收录5分/篇
	普刊，维普、万方收录3分/篇
	
	被国家级刊物转载、专题评论30分/篇
	学校以第一作者单位相关报告被市厅级单位正面批复、评价的每篇加20分/篇
	学校以第一作者单位相关报告被省部级单位正面批复、评价的每篇加50分/篇
	教师以第一作者身份撰写的教改论文等提交到系部0.5分/篇（需符合主题），系部筛选提交到学校，1分/篇，被学校收录，每篇加2分
	说明：
1.论文、报告成果由多人参与的，教师自主协商加分，且不超过该项总分。
2.所有成果须在学校科技处、教务处备案。3.论文成果须以学校为第一作者单位，国际顶级期刊论文，学校作为参与单位的，该项成果折半加分（本条可以忽略）。
4.论文期刊被多个检索收录的，只加分一次，取大值。
5.由多人、多部门参与的成果，教师自行商定加分，且不超过项目总分。
负责人通常指论文作者第一顺位的老师,即论文作者为 A  B  C  D  E 五人 若A B 不是系部老师 C E是系部老师 则author只需填写C E  且C为负责人
负责人如果为第一作者则系数为1，通讯作者为0.8，其它作者为0.5

"""

    # 论文名
    name = models.CharField(max_length=255, verbose_name='论文名称')
    # 论文级别
    level = models.CharField(max_length=255, verbose_name='论文级别', choices=(
        ('SCI/SSCI检索收录1区', 'SCI/SSCI检索收录1区'), ('SCI/SSCI检索收录2区', 'SCI/SSCI检索收录2区'),
        ('SCI/SSCI检索收录3区', 'SCI/SSCI检索收录3区'), ('SCI/SSCI检索收录4区', 'SCI/SSCI检索收录4区'),
        ('EI/A@HCI检索收录', 'EI/A@HCI检索收录'), ('C刊检索收录', 'C刊检索收录'), ('C扩检索收录', 'C扩检索收录'),
        ('CSCD检索收录', 'CSCD检索收录'), ('北核', '北核'), ('普刊知网', '普刊知网'), ('普刊万方维普', '普刊万方维普'),
        ('未发表的教改论文', '未发表的教改论文')))
    # 论文的国标引用
    citations = models.CharField(max_length=1000, verbose_name='论文国标引用', blank=False)
    # 是否被国家级刊物转载、专题评论，默认为否
    is_reprinted = models.BooleanField(verbose_name='国家级转载评论', default=False)
    # 是否被学校作为第一作者单位相关报告被市厅级单位正面批复、评价，默认为否 市厅级单位肯定
    is_city_level = models.BooleanField(verbose_name='市厅级单位肯定', default=False)
    # 是否被省部级单位相关报告被省部级单位正面批复、评价，默认为否
    is_province_level = models.BooleanField(verbose_name='省部级单位肯定', default=False)
    # 教育改革论文级别 且论文是以第一作者身份撰写的教改论文的提交级别 choices为系部、学校、无。默认为无，代表论文不是教改论文
    education_reform_level = models.CharField(max_length=255, verbose_name='教育改革论文级别', choices=(
        ('系部', '系部'), ('学校', '学校'), ('非教改论文', '非教改论文')), default='非教改论文')
    # 是否学校为第一单位
    is_first_unit = models.BooleanField(verbose_name='是否本校为第一单位', default=False)
    # 负责人身份，填报老师身份决定了该项系部考核所认定的分数为多少
    principal_identity = models.CharField(max_length=255, verbose_name='负责人角色', choices=(
        ('第一作者', '第一作者'), ('通讯作者', '通讯作者'), ('其它作者', '其它作者')))

    def get_max_score(self):
        if self.level == 'SCI/SSCI检索收录1区':
            self.max_score = 40
        elif self.level == 'SCI/SSCI检索收录2区':
            self.max_score = 30
        elif self.level == 'SCI/SSCI检索收录3区':
            self.max_score = 15
        elif self.level == 'SCI/SSCI检索收录4区':
            self.max_score = 10
        elif self.level == 'EI/A@HCI检索收录':
            self.max_score = 20
        elif self.level == 'C刊检索收录':
            self.max_score = 20
        elif self.level == 'C扩检索收录':
            self.max_score = 15
        elif self.level == 'CSCD检索收录':
            self.max_score = 18
        elif self.level == '北核':
            self.max_score = 15
        elif self.level == '普刊知网':
            self.max_score = 5
        elif self.level == '普刊万方维普':
            self.max_score = 3
        elif self.level == '未发表的教改论文':
            self.max_score = 0

        if self.is_reprinted:
            self.max_score += 30
        if self.is_province_level:
            self.max_score += 50
        if self.is_city_level:
            self.max_score += 20
        if self.education_reform_level == '学校':
            self.max_score += 2
        elif self.education_reform_level == '系部':
            self.max_score += 0.5

        if self.principal_identity == '第一作者':
            self.max_score = self.max_score * 1
        elif self.principal_identity == '通讯作者':
            self.max_score = self.max_score * 0.8
        elif self.principal_identity == '其它作者':
            self.max_score = self.max_score * 0.4

        if not self.is_first_unit:
            self.max_score = self.max_score * 0.5

        return self.max_score


"""
专利	教师或教师指导的学生以第一发明人获得授权发明专利，每项加15分
	教师或教师指导的学生以第一发明人获得授权实用新型专利，每项加5分
	教师或教师指导的学生以第一发明人获得授权外观专利，每项加3分
	教师或教师指导的学生以第一作者身份获得软件著作权，每项加8分
	说明：
1.成果须在科合处备案。
2.学校须作为第一成果单位，发明专利和软件著作权学校作为参与单位的，该项成果折半加分。
3.由多人、多部门参与的成果，教师自行商定加分，且不超过项目总分。
"""


# 专利与软著
class Patent(BaseModel):
    class Meta:
        verbose_name = '专利与软著'
        verbose_name_plural = '专利与软著'
    input_info = """
    多人项，每一项由多个老师完成，则自己选一个作为负责人填写，一般排名第一的当负责人
专利	教师或教师指导的学生以第一发明人获得授权发明专利，每项加15分
	教师或教师指导的学生以第一发明人获得授权实用新型专利，每项加5分
	教师或教师指导的学生以第一发明人获得授权外观专利，每项加3分
	教师或教师指导的学生以第一作者身份获得软件著作权，每项加8分
	说明：
1.成果须在科合处备案。
2.学校须作为第一成果单位，发明专利和软件著作权学校作为参与单位的，该项成果折半加分。
3.由多人、多部门参与的成果，教师自行商定加分，且不超过项目总分。
"""

    # 软著号或专利号
    number = models.CharField(max_length=255, verbose_name='软著号或专利号')
    # 专利名
    name = models.CharField(max_length=255, verbose_name='专利与软著名称')
    # 专利级别
    level = models.CharField(max_length=255, verbose_name='专利与软著类型', choices=(
        ('发明专利', '发明专利'), ('实用新型专利', '实用新型专利'), ('外观专利', '外观专利'),
        ('软件著作权', '软件著作权')))
    # 是否是本校为第一单位，默认为是
    is_first_unit = models.BooleanField(verbose_name='本校为第一单位', default=True)

    def get_max_score(self):
        try:
            if self.level == '发明专利':
                self.max_score = 15
            elif self.level == '实用新型专利':
                self.max_score = 5
            elif self.level == '外观专利':
                self.max_score = 3
            elif self.level == '软件著作权':
                self.max_score = 8
            if not self.is_first_unit:
                self.max_score = self.max_score * 0.5

            return self.max_score
        except Exception as e:

            return {'error': e}


"""
专著	专著（须完成出版）独著80分/本
	专著（须完成出版）参与合著本人负责部分超过5万字的40分/本
	专著（须完成出版）参与合著本人负责部分超过1万字的10分/本
	说明：
1.成果须在科合处备案。
2.学校须作为第一成果单位，除普通教材外学校作为参与单位的，该项成果折半加分。
3.由多人、多部门参与的成果，教师自行商定加分，且不超过项目总分。
"""


# 专著
class Monograph(BaseModel):
    class Meta:
        verbose_name = '专著'
        verbose_name_plural = '专著'
    input_info = """
    多人项，每一项由多个老师完成，则自己选一个作为负责人填写，一般排名第一的当负责人
    '独著':80
    '非独著5万字以上':40
    '非独著1万字以上':10
	说明：
1.成果须在科合处备案。
2.学校须作为第一成果单位，除普通教材外学校作为参与单位的，该项成果折半加分。
3.由多人、多部门参与的成果，教师自行商定加分，且不超过项目总分。
"""


    # 专著名
    name = models.CharField(max_length=255, verbose_name='著作名称')
    # 出版号
    number = models.CharField(max_length=255, verbose_name='出版号')
    # 专著类型 choices 5万、1万
    book_type = models.CharField(max_length=255, verbose_name='教材类型',
                                 choices=(('独著', '独著'), ('5万字以上', '5万字以上'), ('1万字以上', '1万字以上')))
    # 是否是本校为第一单位，默认为是
    is_first_unit = models.BooleanField(verbose_name='本校为第一单位', default=True)

    def get_max_score(self):
        if self.book_type == '独著':
            self.max_score = 80
        elif self.book_type == '5万字以上':
            self.max_score = 40
        elif self.book_type == '1万字以上':
            self.max_score = 10
        if not self.is_first_unit:
            self.max_score = self.max_score * 0.5
            return self.max_score


"""
教材专著	
基础分
	教材（须完成出版）第一主编30分/本
	教材（须完成出版）其他主编10分/本
	教材（须完成出版）副主编5分/本
以下为加分，取最高值相加
	获评集团级规划教材10分/本
	获评省部级规划教材40分/本
	获评国家级规划教材80分/本
以下为加分，取最高值相加
	获评集团级教材奖项10分/本
	获评省部级教材奖项40分/本
	获评国家级教材奖项80分/本
	说明：
1.成果须在科合处备案。
2.学校须作为第一成果单位，除普通教材外学校作为参与单位的，该项成果折半加分。
3.由多人、多部门参与的成果，教师自行商定加分，且不超过项目总分。
"""


# 教材
class TextBook(BaseModel):
    class Meta:
        verbose_name = '教材'
        verbose_name_plural = '教材'
    input_info = """
    多人项，每项自己商量分配
教材专著	
基础分
	教材（须完成出版）第一主编30分/本
	教材（须完成出版）其他主编10分/本
	教材（须完成出版）副主编5分/本
以下为加分，取最高值相加
	获评集团级规划教材10分/本
	获评省部级规划教材40分/本
	获评国家级规划教材80分/本
以下为加分，取最高值相加
	获评集团级教材奖项10分/本
	获评省部级教材奖项40分/本
	获评国家级教材奖项80分/本
	说明：
1.成果须在科合处备案。
2.学校须作为第一成果单位，除普通教材外学校作为参与单位的，该项成果折半加分。
3.由多人、多部门参与的成果，教师自行商定加分，且不超过项目总分。
"""

    # 教材名
    name = models.CharField(max_length=255, verbose_name='教材名称')
    # 教材出版号
    number = models.CharField(max_length=255, verbose_name='教材出版号')
    # 教材荣誉
    honor = models.CharField(max_length=255, verbose_name='教材荣誉', choices=(
        ('集团级规划教材', '集团级规划教材'), ('省部级规划教材', '省部级规划教材'),
        ('国家级规划教材', '国家级规划教材'),))
    # 教材奖项
    award = models.CharField(max_length=255, verbose_name='教材奖项', choices=(
        ('集团级教材', '集团级教材'), ('省部级教材', '省部级教材'), ('国家级教材', '国家级教材')))
    # 负责人角色
    role = models.CharField(max_length=255, verbose_name='负责人角色',
                            choices=(('第一主编', '第一主编'), ('其他主编', '其他主编'), ('副主编', '副主编')))
    # 是否是本校为第一单位，默认为是
    is_first_unit = models.BooleanField(verbose_name='本校为第一单位', default=True)

    def get_max_score(self):
        # 折算系数
        if self.role == '第一主编':
            self.max_score = 30
        elif self.role == '其他主编':
            self.max_score = 10
        elif self.role == '副主编':
            self.max_score = 5
        if self.honor == '集团级规划教材':
            self.max_score += 10
        elif self.honor == '省部级规划教材':
            self.max_score += 40
        elif self.honor == '国家级规划教材':
            self.max_score += 80
        elif self.award == '集团级教材':
            self.max_score += 10
        elif self.award == '省部级教材':
            self.max_score += 40
        elif self.award == '国家级教材':
            self.max_score += 80

        if not self.is_first_unit:
            self.max_score = self.max_score * 0.5
            return self.max_score


"""
校企合作单位协议
每签订一个加10分
"""


# 校企合作单位协议
class Cooperation(BaseModel):
    class Meta:
        verbose_name = '校企合作单位协议'
        verbose_name_plural = '校企合作单位协议'
    input_info = """
多人项，本项可以由多人合作完成，请自行分配分数
校企合作单位协议
每签订一个加10分
"""

    # 单位名称
    name = models.CharField(max_length=255, verbose_name='单位名称')
    # 单位简介
    description = models.TextField(verbose_name='单位简介')
    # 合同签订日期
    date = models.DateTimeField(verbose_name='合同签订日期')

    def get_max_score(self):
        self.max_score = 10
        return self.max_score


"""
教科研平台立项建设与结题，按教科研项目相应级别2倍加分
建设
    校级，4 分
    市厅级，10 分
    省级，20 分
    国家级，50 分
    集团级，6 分
结题	
    校级，6分
	市厅级，15分
	省级，30分
	国家级，75分
	集团级，10分
"""


# 教科研平台立项建设
class TextResearch(BaseModel):
    class Meta:
        verbose_name = '教科研平台立项建设'
        verbose_name_plural = '教科研平台立项建设'
    input_info = """
    多人项，有每一项的负责人自己分配分数
教科研平台立项建设与结题，按教科研项目相应级别2倍加分
建设
    校级，4 分
    市厅级，10 分
    省级，20 分
    国家级，50 分
    集团级，6 分
结题	
    校级，6分
	市厅级，15分
	省级，30分
	国家级，75分
	集团级，10分
"""


    # 项目名称
    name = models.CharField(max_length=255, verbose_name='项目名称')
    # 项目级别
    level = models.CharField(max_length=255, verbose_name='项目级别', choices=(
        ('校级', '校级'), ('市厅级', '市厅级'), ('省级', '省级'), ('国家级', '国家级'), ('集团级', '集团级')))
    # 类型 是建设还是结题验收
    type = models.CharField(max_length=255, verbose_name='类型',
                            choices=(('立项建设', '立项建设'), ('结题验收', '结题验收')))

    def get_max_score(self):
        if self.type == '立项建设':
            if self.level == '校级':
                self.max_score = 4
            elif self.level == '市厅级':
                self.max_score = 6
            elif self.level == '省级':
                self.max_score = 20
            elif self.level == '国家级':
                self.max_score = 50
            elif self.level == '集团级':
                self.max_score = 10
        elif self.type == '结题验收':
            if self.level == '校级':
                self.max_score = 6
            elif self.level == '市厅级':
                self.max_score = 15
            elif self.level == '省级':
                self.max_score = 30
            elif self.level == '国家级':
                self.max_score = 75
            elif self.level == '集团级':
                self.max_score = 10
        return self.max_score


"""
会议纪要撰写 包括系部、教研室会议纪要，0.2 分/次，可累加
"""


class Meeting(BaseModel):
    class Meta:
        verbose_name = '会议纪要撰写'
        verbose_name_plural = '会议纪要撰写'
    input_info = """
单人项，自己写自己的，写了就加分
会议纪要撰写 包括系部、教研室会议纪要，0.2 分/次，可累加
"""

    # 会议名称
    name = models.CharField(max_length=255, verbose_name='会议名称')
    # 会议时间
    date = models.DateTimeField(verbose_name='会议时间')
    # 会议地点
    place = models.CharField(max_length=255, verbose_name='会议地点')
    # 会议内容
    content = models.TextField(verbose_name='会议内容')

    def get_max_score(self):
        self.max_score = 0.2
        return self.max_score


"""
扣分项	因私调课，每次扣1分
	因私调换监考，每次扣1分
	教学资料存在课程名称、学分、课序号、课程号、教学班级、学期、年级等基本信息错误，每次扣2分。
	教师无故未按照学校或系部规定参加的各类培训、会议、教研活动，且未履行请假手续或手续因不符合要求未通过的，每次扣5分。（教研室层面每次扣3分）
	教师因私未参加系部的各类培训、会议、教研活动，每次扣0.5-1分（按活动的重要性）
	教学警告，每次扣3分
	一般教学事故，每次扣9分
	严重教学事故，每次扣27分
	重大教学事故，每次扣81分
	人才培养方案、教学大纲存在明显错误或严重不合理的，每次扣5分。
	试卷命题出现一般性错误，且不影响考生作答，每次扣2分
	试卷命题出现严重错误，每次扣10分，该项与教学事故不重复扣分，扣分取大值。
	试卷批改出现一般性错误，每次扣2分
	试卷批改出现严重错误，每次扣5分，该项与教学事故不重复扣分，扣分取大值。
	成绩录入、试卷归档未按时完成，每次扣5分。
	考核形式为考查的课程，考核未按照教学大纲执行的，每次扣10分，该项与教学事故不重复扣分，扣分取大值。
	过程性考核资料未保存或保存不规范的，每次扣3分，该项与教学事故不重复扣分，扣分取大值。
	未按照要求按时提交相关材料（如成绩单、试卷等），每次扣1分，提交材料质量较差错误多，每次扣2分，资料特别差，涉嫌编造的，每次扣3分。
	毕业论文指导责任心不强，专业水平差，导致毕业论文质量低，存档严重不规范等，系部层面查出每次扣5分，学校层面每次扣10分。该项以系部和学校及以上级别抽检结果为准。
	违规使用教材，造成不良影响的，每次扣减30分。
	系部督导反馈教学存在问题扣1分/次，系部以上层面反馈问题扣3分/次
	听课记录老老师每周1份，新老师（入职一年内）每周2份，每缺少1篇扣1分
	按时参加“三会一课”，民主生活会，主题教育，党员大会等支部会议。因私请假者扣1分/次；无故缺席者扣2分/次
	评议为不合格共产党员者，扣2分
"""


# 扣分事项
class Deduct(BaseModel):
    class Meta:
        verbose_name = '扣分事项'
        verbose_name_plural = '扣分事项'
    input_info ="""
扣分项	因私调课，每次扣1分
	因私调换监考，每次扣1分
	教学资料存在课程名称、学分、课序号、课程号、教学班级、学期、年级等基本信息错误，每次扣2分。
	教师无故未按照学校或系部规定参加的各类培训、会议、教研活动，且未履行请假手续或手续因不符合要求未通过的，每次扣5分。（教研室层面每次扣3分）
	教师因私未参加系部的各类培训、会议、教研活动，每次扣0.5-1分（按活动的重要性）
	教学警告，每次扣3分
	一般教学事故，每次扣9分
	严重教学事故，每次扣27分
	重大教学事故，每次扣81分
	人才培养方案、教学大纲存在明显错误或严重不合理的，每次扣5分。
	试卷命题出现一般性错误，且不影响考生作答，每次扣2分
	试卷命题出现严重错误，每次扣10分，该项与教学事故不重复扣分，扣分取大值。
	试卷批改出现一般性错误，每次扣2分
	试卷批改出现严重错误，每次扣5分，该项与教学事故不重复扣分，扣分取大值。
	成绩录入、试卷归档未按时完成，每次扣5分。
	考核形式为考查的课程，考核未按照教学大纲执行的，每次扣10分，该项与教学事故不重复扣分，扣分取大值。
	过程性考核资料未保存或保存不规范的，每次扣3分，该项与教学事故不重复扣分，扣分取大值。
	未按照要求按时提交相关材料（如成绩单、试卷等），每次扣1分，提交材料质量较差错误多，每次扣2分，资料特别差，涉嫌编造的，每次扣3分。
	毕业论文指导责任心不强，专业水平差，导致毕业论文质量低，存档严重不规范等，系部层面查出每次扣5分，学校层面每次扣10分。该项以系部和学校及以上级别抽检结果为准。
	违规使用教材，造成不良影响的，每次扣减30分。
	系部督导反馈教学存在问题扣1分/次，系部以上层面反馈问题扣3分/次
	听课记录老老师每周1份，新老师（入职一年内）每周2份，每缺少1篇扣1分
	按时参加“三会一课”，民主生活会，主题教育，党员大会等支部会议。因私请假者扣1分/次；无故缺席者扣2分/次
	评议为不合格共产党员者，扣2分
"""

    # 扣分名
    name = models.CharField(max_length=255, verbose_name='扣分名')
    # 扣分事项
    description = models.TextField(verbose_name='扣分事项')
    # 扣分值
    del_score = models.FloatField(verbose_name='(带+-)扣分值')

    def get_max_score(self):
        self.max_score = self.del_score
        return self.max_score


"""
其它加减分事项，这部分内容无法自动评分
"""


# 其它加减分事项
class Other(BaseModel):
    class Meta:
        verbose_name = '其它加减分事项'
        verbose_name_plural = '其它加减分事项'
    input_info = """
其它加减分事项，这部分内容无法自动评分
"""


    # 分名
    name = models.CharField(max_length=255, verbose_name='事务名')
    # 分事项
    description = models.TextField(verbose_name='加减分事项')
    # 分值
    other_score = models.FloatField(verbose_name='(带+-)加减分值')

    def get_max_score(self):
        self.max_score = self.other_score
        return self.max_score


# 打印所有当前文件中模型类的名称

# model_dict = {
#     'BasicTeachingTask': BasicTeachingTask,
#     'TeacherCompetition': TeacherCompetition,
#     'Certificate': Certificate,
#     'InnovationProject': InnovationProject,
#     'ResearchProject': ResearchProject,
#     'Competition': Competition,
#     'Training': Training,
#     'News': News,
#     'Judge': Judge,
#     'EnterpriseVisit': EnterpriseVisit,
#     'PartyWork': PartyWork,
#     'Recruitment': Recruitment,
#     'ProfessionalIntroduction': ProfessionalIntroduction,
#     'WelcomeWork': WelcomeWork,
#     'NewTeacherInterview': NewTeacherInterview,
#     'NewTeacherTrain': NewTeacherTrain,
#     'ExcellentTalent': ExcellentTalent,
#     'ExtraInspection': ExtraInspection,
#     'SchoolMeeting': SchoolMeeting,
#     'WorkGroup': WorkGroup,
#     'Website': Website,
#     'Activity': Activity,
#     'Course': Course,
#     'TemporaryWork': TemporaryWork,
#     'Participate': Participate,
#     'Visit': Visit,
#     'CrossCourse': CrossCourse,
#     'ResearchAward': ResearchAward,
#     'Paper': Paper,
#     'Patent': Patent,
#     'Monograph': Monograph,
#     'TextBook': TextBook,
#     'Cooperation': Cooperation,
#     'TextResearch': TextResearch,
#     'Deduct': Deduct,
#     'Other': Other,
# }

# 获取当前文件中的所有类名 除了BaseModel
model_dict = {}
for name in dir():
    if name != 'BaseModel':
        model_dict[name] = eval(name)
